/*
 * @Descripttion:
 * @version:
 * @Author: JinYiGao
 * @Date: 2021-08-29 15:24:08
 * @LastEditors: JinYiGao
 * @LastEditTime: 2021-08-29 15:24:09
 */
#pragma once

#include <Eigen/Eigen>
#include <glad/glad.h>

#include <string>
#include <vector>

#include <utils/shader.h>

using namespace std;

struct Vertex {
    Eigen::Vector3f Position;
    Eigen::Vector3f Normal;
    Eigen::Vector2f TexCoords;
    Eigen::Vector3f Tangent; // 切线
    Eigen::Vector3f Bitangent;

    Vertex() {
        this->Position = Eigen::Vector3f(0.0, 0.0, 0.0);
        this->Normal = Eigen::Vector3f(0.0, 0.0, 0.0);
        this->TexCoords = Eigen::Vector2f(0.0, 0.0);
        this->Tangent = Eigen::Vector3f(0.0, 0.0, 0.0);
        this->Bitangent = Eigen::Vector3f(0.0, 0.0, 0.0);
    }
};

struct Texture {
    GLuint id;
    string type;
    string path;
};

class Mesh {
public:
    Mesh();
    ~Mesh();

    Mesh(vector<Vertex> vertices, vector<GLuint> indices, vector<Texture> textures);

public:
    vector<Vertex> vertices;  // 顶点集合
    vector<GLuint> indices;   // 顶点索引集合
    vector<Texture> textures; // 纹理集合

    GLuint VAO;

    void Draw(Shader *shader);

private:
    GLuint VBO;
    GLuint EBO;

    void setupMesh(); // 初始化Mesh解析
};